import CollUtil from "@/parent-ui2/src/main/js/utils/CollUtil";
import StrUtil from "@/parent-ui2/src/main/js/utils/StrUtil";

export default {
    name: 'ModuleUtil',
    /**
     * 实体列表 转成 带模块的实体列表
     * @param entitiesOri       实体列表 例如 ['userAddress','admin.sysDict'] (可能包含 模块.实体名称)
     * @param rootModuleKey     默认模块编号
     * @return                  例如[{entity:'userAddress',module:'user'}]
     */
    loadEntityObjs(entitiesOri, rootModuleKey) {
        rootModuleKey = StrUtil.camelToKebab(rootModuleKey)
        return entitiesOri.map(e => {
            return e.indexOf('\.') >= 0 ? {
                entity: e.split('\.')[1],
                module: StrUtil.camelToKebab(e.split('\.')[0])
            } : {entity: e, module: rootModuleKey}
        })
    },
    /**
     * 实体列表 转成 带模块的实体列表
     * @param entitiesOri       实体列表 例如 ['userAddress','admin.sysDict'] (可能包含 模块.实体名称)
     * @param rootModuleKey     默认模块编号
     * @return                  例如[{entity:'userAddress',module:'user'}]
     */
    loadEntityObjsReplaceModule(entitiesOri, rootModuleKey) {
        rootModuleKey = StrUtil.camelToKebab(rootModuleKey)
        return entitiesOri.map(e => {
            return e.indexOf('\.') >= 0 ? {
                entity: e.split('\.')[1],
                module: rootModuleKey
            } : {entity: e, module: rootModuleKey}
        })
    },
    /**
     * 实体列表 转成 带模块的实体列表 并执行方法返回
     * @param entitiesOri       实体列表 例如 ['userAddress','admin.sysDict'] (可能包含 模块.实体名称)
     * @param rootModuleKey     默认模块编号
     * @param {function} loadFun - 加载函数，接受 (module, entity) 作为参数
     * @return                  例如[{entity:'userAddress',module:'user'}]
     */
    async loadEntityObjsFun(entitiesOri, rootModuleKey, loadFun) {
        let entityObjs = this.loadEntityObjs(entitiesOri, rootModuleKey);
        return Promise.all(
            entityObjs.map(entityObj => loadFun(entityObj.module, entityObj.entity))
        );
    },
    /**
     * 实体列表 按模块 分组先对实体分组
     * @param entitiesOri       实体列表 例如 ['userAddress','admin.sysDict'] (可能包含 模块.实体名称)
     * @param rootModuleKey     默认模块编号
     * @return                  例如 {module1:[entity1,entity2],module2:[entity3,entity4]}
     */
    loadModuleListMap(entitiesOri, rootModuleKey) {
        let entityObjs = this.loadEntityObjs(entitiesOri, rootModuleKey);
        // 按模块分组
        return CollUtil.listToListMap(entityObjs, e => e.module, e => e.entity)
    },
    /**
     * 实体列表 按模块 分组先对实体分组,在按模块执行某些批量任务
     * @param entitiesOri       实体列表(可能带了特定的模块编号)
     * @param rootModuleKey     默认模块编号
     * @param loadFun           批量任务
     */
    loadModuleListMapAndLoad(entitiesOri, rootModuleKey, loadFun) {
        let moduleListMap = this.loadModuleListMap(entitiesOri, rootModuleKey);
        return Promise.all(
            Object.keys(moduleListMap).map(async(module) => {
                let entities = moduleListMap[module];
                return await loadFun(module, entities)
            })
        );
    },
    // async moduleListMapLoad(entityObjs, loadFun) {
    //     let moduleListMap = CollUtil.listToListMap(entityObjs, e => e.module, e => e.entity)
    //     return Promise.all(
    //         Object.keys(moduleListMap).map(module => {
    //             let entities = moduleListMap[module];
    //             loadFun(module, entities)
    //         })
    //     );
    // },
}
